<?php
class ordenes_trabajo_model extends CI_Model{
	
	function __construct(){
		parent::__construct();
	}
	
	/**
	 * Obtiene el listado de ordenes de trabajo
	 */
	public function getOrdenesTrabajo(){
		$sql = '';
		//paginacion
		$params = array(
				'result_items_per_page' => '30',
				'result_page' => (isset($_GET['pag'])? $_GET['pag']: 0)
		);
		if($params['result_page'] % $params['result_items_per_page'] == 0)
			$params['result_page'] = ($params['result_page']/$params['result_items_per_page']);
		
		//Filtros para buscar
		if($this->input->get('ffecha1') != '' && $this->input->get('ffecha2') != '')
			$sql = " AND Date(c.fecha) BETWEEN '".$this->input->get('ffecha1')."' AND '".$this->input->get('ffecha2')."'";
		elseif($this->input->get('ffecha1') != '')
			$sql = " AND Date(c.fecha) = '".$this->input->get('ffecha1')."'";
		elseif($this->input->get('ffecha2') != '')
			$sql = " AND Date(c.fecha) = '".$this->input->get('ffecha2')."'";
		if($this->input->get('ffolio') != '')
			$sql .= " AND c.folio = '".$this->input->get('ffolio')."'";
		if($this->input->get('fid_cliente') != '')
			$sql .= " AND cs.id_sucursal = '".$this->input->get('fid_cliente')."'";
		
		$query = BDUtil::pagination("
				SELECT c.id_ordent, Date(c.fecha) AS fecha, c.serie, c.folio, cs.nombre_fiscal, c.status, c.tipo, 
					(e.apellido_paterno || ' ' || e.apellido_materno || ' ' || e.nombre) AS nombre_vendedor, c.facturada
				FROM ordenest AS c 
					INNER JOIN clientes_sucursales AS cs ON cs.id_sucursal = c.id_cliente
					INNER JOIN empleados AS e ON e.id_empleado = c.id_vendedor
				WHERE c.status <> 'ca' AND c.status <> 'n'".$sql."
				ORDER BY (Date(c.fecha), c.folio) DESC
				", $params, true);
		$res = $this->db->query($query['query']);
		
		$response = array(
				'cotiza' => array(),
				'total_rows' 		=> $query['total_rows'],
				'items_per_page' 	=> $params['result_items_per_page'],
				'result_page' 		=> $params['result_page']
		);
		if($res->num_rows() > 0)
			$response['cotiza'] = $res->result();
		
		return $response;
	}
	
	/**
	 * Obtiene la informacion de una orden de trabajo
	 * @param unknown_type $id. id ordent t
	 * @param unknown_type $info_basic. si es true regresa la info basica
	 * @param unknown_type $prod_recar. si es true regresa productos de una orden que permitan avisar con alertas.
	 */
	public function getInfoOrdenTrabajo($id, $info_basic=false, $prod_recar=false){
		$res = $this->db
			->select('*')
			->from('ordenest')
			->where("id_ordent = '".$id."'")
		->get();
		if($res->num_rows() > 0){
			$response['info'] = $res->row();
			$response['info']->fecha = substr($response['info']->fecha, 0, 10);
			$res->free_result();
			if($info_basic)
				return $response;
			
			$this->load->model('clientes_model');
			$prov = $this->clientes_model->getInfoCliente($response['info']->id_cliente, true);
			$response['info']->cliente = $prov['info'];
			
			$this->load->model('empleados_model');
			$prov = $this->empleados_model->getInfoEmpleado($response['info']->id_vendedor, true);
			$response['info']->nombre_vendedor = $prov['info']->apellido_paterno.' '.$prov['info']->apellido_materno.' '.$prov['info']->nombre;
			
			//productos
			$this->db
				->select('p.id_producto, p.codigo, p.nombre, cp.taza_iva, cp.cantidad, cp.precio_unitario, 
						cp.importe, cp.importe_iva, cp.total')
				->from('ordenest_productos AS cp')
					->join('productos AS p', 'p.id_producto = cp.id_producto', 'inner');
				$psql = '';
				if($prod_recar){
					$this->db->join('productos_familias AS pf', 'pf.id_familia = p.id_familia', 'inner');
					$psql = " AND pf.avisa_producto = 't'";
				}
			$res = $this->db->where("cp.id_ordent = '".$id."'".$psql)
			->get();
			if($res->num_rows() > 0){
				$response['productos'] = $res->result();
			}
			$res->free_result();
			
			return $response;
		}else
			return false;
	}
	
	/**
	 * Obtiene el folio que se le asignara a la orden de trabajo, el consecutivo
	 */
	public function getFolioOrdent($id_empleado){
		$res = $this->db->query("SELECT get_folio_ordenest('".$id_empleado."');");
		$data = $res->row();
		return $data->get_folio_ordenest;
	}
	
	/**
	 * Agrega una cotizacion a la bd
	 */
	public function addOrdenTrabajo(){
		$status = ($this->input->post('dcondicion_pago')=='co'? 'pa': 'p');
		
		$serie_v = '';
		$serie_vendedor = explode(' ', $this->input->post('dvendedor'));
		foreach($serie_vendedor as $iit){
			$serie_v .= $iit{0};
		}
		
		$id_ordent = BDUtil::getId();
		$data = array(
			'id_ordent' => $id_ordent,
			'id_cliente' => $this->input->post('did_cliente'),
			'id_vendedor' =>$this->input->post('did_vendedor'),
			'id_usuario' => $_SESSION['id_empleado'],
			'serie' => mb_strtoupper($serie_v, 'utf-8'),
			'folio' => $this->input->post('dfolio'),
			'fecha' => $this->input->post('dfecha'),
			'domicilio' => $this->input->post('dcliente_domici'),
			'ciudad' => $this->input->post('dcliente_ciudad'),
			'subtotal' => $this->input->post('dtsubtotal'),
			'importe_iva' => $this->input->post('dtiva'),
			'total' => $this->input->post('dttotal'),
			'observaciones' => $this->input->post('dobservaciones'),
			'condicion_pago' => $this->input->post('dcondicion_pago'),
			'plazo_credito' => $this->input->post('dplazo_credito'),
			'status' => $status,
			'sin_rango' => $this->input->post('dsin_rango'),
			'tipo' => $this->input->post('dtipo')
		);
		$this->db->insert('ordenest', $data);
		
		//productos para las ordenes trabajo
		if(isset($_POST['dpid_producto'])){
			$this->addProductos($id_ordent);
		}
		
		//Inserta alertas para recordar las ventas
		$this->db->query("SELECT insert_alertas_ordenest('".$id_ordent."', '".$data['serie']."', '".$data['folio']."', '".$data['fecha']."');");
		
		return array(true, $status, $id_ordent);
	}

	public function editOrdenTrabajo(){
		$serie_v = '';
		$serie_vendedor = explode(' ', $this->input->post('dvendedor'));
		foreach($serie_vendedor as $iit){
			$serie_v .= $iit{0};
		}
		
		$data = array(
			'id_vendedor' =>$this->input->post('did_vendedor'),
			'serie' => mb_strtoupper($serie_v, 'utf-8'),
			'folio' => $this->input->post('dfolio'),
			'sin_rango' => $this->input->post('dsin_rango'),
			'tipo' => $this->input->post('dtipo')
		);
		$this->db->update('ordenest', $data, "id_ordent = '".$this->input->post('did_orden')."'");
		
		return array(true);
	}
	
	/**
	 * Cancela una cotizacion, la elimina
	 */
	public function cancelaOrdenTrabajo(){
		$this->db->update('ordenest', array('status' => 'ca'), "id_ordent = '".$_GET['id']."'");
		$this->db->update('ordenest_abonos', array('tipo' => 'ca'), "id_ordent = '".$_GET['id']."'");
		return array(true, '');
	}
	
	
	/**
	 * Agrega los productos a una orden de trabajo
	 * @param unknown_type $id_orden
	 * @param unknown_type $tipo
	 */
	public function addProductos($id_orden, $tipo='add'){
		if(is_array($_POST['dpid_producto'])){
			$data_productos = array();
			foreach($_POST['dpid_producto'] as $key => $producto){
				//Datos de los productos de la compra
				$data_productos[] = array(
					'id_ordent' => $id_orden,
					'id_producto' => $producto,
					'taza_iva' => $_POST['dptaza_iva'][$key],
					'cantidad' => $_POST['dpcantidad'][$key],
					'precio_unitario' => $_POST['dpprecio_unitario'][$key],
					'importe' => $_POST['dpimporte'][$key],
					'importe_iva' => $_POST['dpimporte_iva'][$key],
					'total' => ($_POST['dpimporte'][$key]+$_POST['dpimporte_iva'][$key]),
				);
				
				//obtengo e inserto los productos base que consume el producto a registrar
				$prod_inv = $this->productosInventario($producto, $_POST['dpcantidad'][$key], $_POST['dpprecio_unitario'][$key]);
				foreach($prod_inv as $prod){
					$res = $this->db->select("id_producto")
						->from("ordenest_productos_inv")
						->where( array( 'id_ordent' => $id_orden, 'id_producto' => $prod['id_producto']))
					->get();
					
					$importe = String::float($prod['cantidad']*$prod['pu']);
					$importe_iva = String::float($_POST['dptaza_iva'][$key]*$importe);
					if($res->num_rows() > 0){
						//si ya se agrego se actualiza los datos del producto base
						$this->db->query("UPDATE ordenest_productos_inv 
								SET cantidad = cantidad+".$prod['cantidad'].", importe = importe+".$importe.", 
									importe_iva = importe_iva+".$importe_iva.", total = total+".($importe+$importe_iva)." 
								WHERE id_ordent = '".$id_orden."' AND id_producto = '".$prod['id_producto']."'");
					}else{
						//si el producto base aun no existe se inserta
						$data_productos_inv = array(
							'id_ordent' => $id_orden,
							'id_producto' => $prod['id_producto'],
							'taza_iva' => $_POST['dptaza_iva'][$key],
							'cantidad' => $prod['cantidad'],
							'precio_unitario' => $prod['pu'],
							'importe' => $importe,
							'importe_iva' => $importe_iva,
							'total' => ($importe+$importe_iva),
						);
						$this->db->insert('ordenest_productos_inv', $data_productos_inv);
					}
					$res->free_result();
				}
			}

			if(count($data_productos) > 0){
				if($tipo != 'add' && $this->input->post('dpupdate') == 'si'){
					$this->db->delete('ordenest_productos', "id_ordent = '".$id_orden."'");
					$this->db->delete('ordenest_productos_inv', "id_ordent = '".$id_orden."'");
				}
				//se insertan los productos de la orden	
				$this->db->insert_batch('ordenest_productos', $data_productos);
			}
			
			return array(true, '');
		}
		return array(false, '');
	}
	/**
	 * Obtiene los productos base que consume un producto que se registrara en la orden
	 * @param unknown_type $id_producto
	 * @param unknown_type $cantidad
	 * @param unknown_type $pu
	 */
	public function productosInventario($id_producto, $cantidad, $pu=null){
		$res = $this->db->query("SELECT tipo FROM productos WHERE id_producto = '".$id_producto."'");
		$data = $res->row();
		if($data->tipo == 'base'){
			if($pu == null){
				$res = $this->db->query("SELECT pu_ultima_compra('".$id_producto."') AS pu;");
				$data = $res->row();
				$pu = $data->pu;
			}
			$productos[] = array('id_producto' => $id_producto, 'cantidad' => $cantidad, 'pu' => $pu);
		}else{
			$res = $this->db->query("SELECT id_producto_c, cantidad FROM productos_consumos WHERE id_producto = '".$id_producto."'");
			foreach($res->result() as $row){
				$data_pro = $this->productosInventario($row->id_producto_c, $row->cantidad);
				foreach($data_pro as $pro){
					$pro['cantidad'] *= $cantidad;
					$productos[] = $pro;
				}
			}
		}
		return $productos;
	}
	
	public function getOrdenestSinFacturar($id_cliente=null){
		//paginacion
		$params = array(
				'result_items_per_page' => '30',
				'result_page' => (isset($_GET['pag'])? $_GET['pag']: 0)
		);
		if($params['result_page'] % $params['result_items_per_page'] == 0)
			$params['result_page'] = ($params['result_page']/$params['result_items_per_page']);
		
		$sql = '';
		if($this->input->get('ffecha1') != '' && $this->input->get('ffecha2') != '')
			$sql = " AND Date(o.fecha) BETWEEN '".$this->input->get('ffecha1')."' AND '".$this->input->get('ffecha2')."'";
		elseif($this->input->get('ffecha1') != '')
			$sql = " AND Date(o.fecha) = '".$this->input->get('ffecha1')."'";
		elseif($this->input->get('ffecha2') != '')
			$sql = " AND Date(o.fecha) = '".$this->input->get('ffecha2')."'";
		if($this->input->get('ffolio') != '')
			$sql .= " AND o.folio = '".$this->input->get('ffolio')."'";
		if ($this->input->get('ffcliente') != '') 
			$sql .= " AND LOWER(cs.nombre_fiscal) LIKE '%".mb_strtolower($this->input->get('ffcliente'), 'UTF-8')."%'";
		if ($id_cliente != null) 
			$sql .= " AND o.id_cliente = '".$id_cliente."'";
		
		$query = BDUtil::pagination("
				SELECT o.id_ordent, Date(o.fecha) AS fecha, o.serie, o.folio, cs.nombre_fiscal, o.total, o.status 
				FROM ordenest AS o 
					INNER JOIN clientes_sucursales AS cs ON o.id_cliente = cs.id_sucursal
				WHERE o.facturada = 'f' AND o.status <> 'ca' AND o.status <> 'n'
					".$sql."
				ORDER BY (Date(o.fecha), o.folio) DESC
				", $params, true);
		$res = $this->db->query($query['query']);
		
		$response = array(
				'orden' 			=> array(),
				'total_rows' 		=> $query['total_rows'],
				'items_per_page' 	=> $params['result_items_per_page'],
				'result_page' 		=> $params['result_page']
		);
		if($res->num_rows() > 0)
			$response['orden'] = $res->result();
		
		return $response;
	}
	
	
	
	/**
	 * Agrega abono a una orden de trabajo
	 * @param unknown_type $id_ordent
	 * @param unknown_type $concepto
	 */
	public function addAbono($id_ordent=null, $concepto=null){
		$id_ordent = $id_ordent==null? $this->input->get('id'): $id_ordent;
		$concepto = $concepto==null? $this->input->post('dconcepto'): $concepto;
		
		$data = $this->obtenTotalAbonosC($id_ordent);
		if($data->abonos < $data->total){ //Evitar que se agreguen abonos si esta pagada
			$pagada = false;
			//compruebo si se pasa el abono al total de la factura y activa a pagado
			if(($this->input->post('dmonto')+$data->abonos) >= $data->total){
				if(($this->input->post('dmonto')+$data->abonos) > $data->total)
					$_POST['dmonto'] = $this->input->post('dmonto') - (($this->input->post('dmonto')+$data->abonos) - $data->total);
				$pagada = true;
			}
			
			$id_abono = BDUtil::getId();
			$data_abono = array(
				'id_abono' => $id_abono,
				'id_ordent' => $id_ordent,
				'fecha' => $this->input->post('dfecha'),
				'concepto' => $concepto,
				'total' => $this->input->post('dmonto')
			);
			$this->db->insert('ordenest_abonos', $data_abono);
			
			if($pagada){
				$this->db->update('ordenest', array('status' => 'pa'), "id_ordent = '".$id_ordent."'");
			}
			
			//Registramos la Operacion en Bancos
			$this->load->model('banco_model');
			$respons = $this->banco_model->addOperacion($this->input->post('dcuenta'));
			
			return array(true, 'Se agregó el abono correctamente.', $id_abono);
		}
		return array(true, 'La orden de trabajo ya esta pagada.', '');
	}
	
	/**
	 * Elimina abonos de cobranza (de una ordent)
	 * @param unknown_type $id_abono
	 * @param unknown_type $id_ordent
	 */
	public function deleteAbono($id_abono, $id_ordent){
		$this->db->delete('ordenest_abonos', "id_abono = '".$id_abono."'");
		
		$data = $this->obtenTotalAbonosC($id_ordent);
		if($data->abonos >= $data->total){ //si abonos es = a la factura se pone pagada
			$this->db->update('ordenest', array('status' => 'pa'), "id_ordent = '".$id_ordent."'");
		}else{ //si abonos es menor se pone pendiente
			$this->db->update('ordenest', array('status' => 'p'), "id_ordent = '".$id_ordent."'");
		}
		
		return array(true, '');
	}
	
	private function obtenTotalAbonosC($id){
		$data = $this->db->query("
			SELECT
				c.total,
				COALESCE(ab.abonos,0) AS abonos
			FROM ordenest AS c
				LEFT JOIN (
					SELECT id_ordent, Sum(total) AS abonos
					FROM ordenest_abonos
					WHERE id_ordent = '".$id."' AND tipo <> 'ca'
					GROUP BY id_ordent
				) AS ab ON c.id_ordent = ab.id_ordent
			WHERE c.id_ordent = '".$id."'", true);
		return $data->row();
	}
	
	
	/** ****************************************
	 * 			CONTROL DE TALLER
	 * *****************************************
	 * obtiene las ordenes de trabajo que entraran al taller para su procesamiento
	 */
	public function getControlTaller(){
		$sql = '';
		//paginacion
		$params = array(
				'result_items_per_page' => '30',
				'result_page' => (isset($_GET['pag'])? $_GET['pag']: 0)
		);
		if($params['result_page'] % $params['result_items_per_page'] == 0)
			$params['result_page'] = ($params['result_page']/$params['result_items_per_page']);
		
		//Filtros para buscar
		if($this->input->get('ffecha1') != '' && $this->input->get('ffecha2') != '')
			$sql = " AND Date(c.fecha) BETWEEN '".$this->input->get('ffecha1')."' AND '".$this->input->get('ffecha2')."' AND c.tiene_products = 't'";
		else{
			$sql = " AND c.tiene_products = 't' AND c.terminada_taller = 'f'";
		}
		
		$query = BDUtil::pagination("
				SELECT 
					c.id_ordent, Date(c.fecha) AS fecha, c.serie, c.folio, cs.nombre_fiscal, c.status, c.tipo,
					(e.apellido_paterno || ' ' || e.apellido_materno || ' ' || e.nombre) AS nombre_vendedor, c.facturada,
					c.holograma_ini, c.holograma_fin, c.terminada_taller, Date(c.fecha_salida) AS fecha_salida,
					c.observaciones
				FROM ordenest AS c
					INNER JOIN clientes_sucursales AS cs ON cs.id_sucursal = c.id_cliente
					INNER JOIN empleados AS e ON e.id_empleado = c.id_vendedor
				WHERE c.status <> 'ca' AND c.status <> 'n'".$sql."
				ORDER BY (Date(c.fecha), c.folio) ASC
				", $params, true);
		$res = $this->db->query($query['query']);
		
		$response = array(
				'cotiza' 			=> array(),
				'productos' 		=> array(),
				'total_rows' 		=> $query['total_rows'],
				'items_per_page' 	=> $params['result_items_per_page'],
				'result_page' 		=> $params['result_page']
		);
		if($res->num_rows() > 0){
			$response['cotiza'] = $res->result();
			
			foreach($response['cotiza'] as $itm){
				$res_prod = $this->db->query("
				SELECT p.id_producto, op.cantidad, p.nombre 
				FROM ordenest_productos AS op 
					INNER JOIN productos AS p ON p.id_producto = op.id_producto
					INNER JOIN productos_familias AS pf ON pf.id_familia = p.id_familia
				WHERE op.id_ordent = '".$itm->id_ordent."' AND pf.avisa_producto = 't';
				");
				$response['productos'][$itm->id_ordent] = $res_prod->result();
				$res_prod->free_result();
			}
		}
		
		return $response;
	}
	
	/**
	 * Actualiza los hologramas de una orden en el taller
	 */
	public function updateHologramas(){
		$upd = false;
		if(isset($_POST['holograma_ini']{0})){
			$datos = array('holograma_ini' => intval($_POST['holograma_ini']));
			$upd = true;
		}elseif(isset($_POST['holograma_fin']{0})){
			$datos = array('holograma_fin' => intval($_POST['holograma_fin']));
			$upd = true;
		}
			
		if($upd)
			$this->db->update('ordenest', $datos,
				"id_ordent = '".$_POST['id_orden']."'");
		
		return array(true, '');
	}
	
	/**
	 * Marca una orden como terminada en el taller
	 */
	public function terminarOrden(){
		$this->db->update('ordenest', 
				array('terminada_taller' => ($_POST['terminada']=='si'? 't': 'f'),
						'fecha_salida' => date("Y-m-d H:i:s")),
				"id_ordent = '".$_POST['id_orden']."'");
	
		return array(true, '');
	}
	
}